/**
 * 冒泡排序是一种简单的排序算法，其基本思想是通过多次遍历待排序的列表，比较相邻的元素并根据需要交换它们的位置，从而逐步将最大的元素移动到列表的末尾。这个过程类似于水中的气泡逐渐上浮，因此得名“冒泡排序”。
 * 冒泡排序的基本步骤：
 * - 外层循环：控制遍历的次数，通常是从0到n-1（n是列表的长度）。
 * - 内层循环：在每次外层循环中，从列表的第一个元素开始，依次比较相邻的两个元素。
 * - 比较和交换：如果前一个元素大于后一个元素，则交换它们的位置。
 * - 优化：可以设置一个标志位，如果在一次完整的内层循环中没有发生任何交换，说明列表已经有序，可以提前结束排序。
 */

const arr1 = [5, 7, 1, 6, 8, 4, 2, 3];
const arr2 = [5, 7, 1, 6, 8, 4, 2, 3];

/**
 * 冒泡排序(正序)
 * @param arr 要排序的数组
 * @param mode 排序的模式(true:正序 false:倒序)
 * @param n 冒泡的次数
 * @returns 排序后的数组
 */
function bubbleSort(arr, mode = true, n = arr.length) {
  if (n <= 1) return arr;
  let bool = true;
  for (let i = 0; i < n; i++) {
    let _mode = mode ? arr[i] > arr[i + 1] : arr[i] < arr[i + 1];
    if (_mode) {
      [arr[i + 1], arr[i]] = [arr[i], arr[i + 1]];
      bool = false;
    }
  }
  if (bool) return;
  return bubbleSort(arr, mode, n - 1);
}

bubbleSort(arr1);
console.log("▶『正序』", arr1);
bubbleSort(arr2, false);
console.log("▶『倒序』", arr2);
